﻿using BLL.Utility;
using Entity.Context;
using Entity.Models;
using System;
using System.Collections;
using System.Linq;

namespace BLL.Sgf
{
    public sealed class CategoriaDespesaBLL : AbstractClass
    {

        #region -- BuscaTodos --
        public IList BuscaTodos(int usuarioId)
        {
            try
            {
                using (var ctx = new Context())
                {
                    return (from c in ctx.CategoriaDespesa
                            orderby c.Descricao
                            where c.UsuarioId == usuarioId
                            select c).ToList();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaDespesaBLL.BuscaTodos :: " + ex.Message, ex);
            }
        }
        #endregion

        #region -- Salvar --
        public void Salvar(CategoriaDespesa pEntity)
        {
            try
            {
                Valida(pEntity);
                using (var ctx = new Context())
                {
                    ctx.CategoriaDespesa.Add(pEntity);
                    ctx.SaveChanges();
                }
            }
            catch (EValidationException evx)
            {
                throw new EValidationException(evx.Message);
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaDespesaBLL.Salvar :: " + ex.Message, ex);
            }
        }
        #endregion

        #region -- Valida --
        private static void Valida(CategoriaDespesa pEntity)
        {
            if (string.IsNullOrEmpty(pEntity.Descricao))
                throw new EValidationException("Descrição é obrigatório.");
            if (VerificaJáCadastrado(pEntity))
                throw new EValidationException("Categoria despesa já cadastrada.");
        }
        #endregion

        #region -- VerificaJáCadastrado --
        private static bool VerificaJáCadastrado(CategoriaDespesa pEntity)
        {
            try
            {
                using (var ctx = new Context())
                {
                    return (from c in ctx.CategoriaDespesa
                            where c.Descricao.Equals(pEntity.Descricao) && c.UsuarioId == pEntity.UsuarioId
                            select c).Any();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("CategoriaDespesaBLL.VerificaJáCadastrado :: " + ex.Message, ex);
            }
        }
        #endregion

    }
}
